//package com.per.mybootall.mqtt.yc;
//
//import lombok.extern.slf4j.Slf4j;
//import org.eclipse.paho.client.mqttv3.*;
//import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.context.annotation.Bean;
//import org.springframework.stereotype.Component;
//
//import java.util.UUID;
//
///**
// * mqtt推送服务,如需进行mqtt推送，请使用此类方法
// * @author yc
// */
//@Component
//@Slf4j
//public class MQTTService {
//    //tcp://MQTT安装的服务器地址:MQTT定义的端口号
////    private static final String MQTT_HOST = "tcp://192.168.0.57:1883";
//    //定义MQTT的ID,一个clientID只能建立一个连接
//    private static final String MQTT_CLIENTID = "java"+ UUID.randomUUID().toString();
//
//    //用户名，启用账号验证时有用
////    private static final String MQTT_USERNAME = "java";
//    //密码，启用账号验证时有用
////    private static final String MQTT_PASSWORD = "123abc";
//
//    //超时时间 单位为秒
////    private static final int MQTT_TIMEOUT = 10;
//    //设置会话心跳时间 单位为秒
////    private static final int MQTT_KEEPALIVE = 10;
//
//    //默认订阅主题
//    private String[] MQTT_TOPIC = {MQTT_CLIENTID+"/private/#"};
////    private String[] MQTT_TOPIC = {"$SYS/brokers/+/clients/#"};
//    //默认订阅主题的qos
//    private int[] MQTT_QOS = {2};
//
//    @Value("${mqtt.url}")
//    private String url;
//
//    @Value("${mqtt.username}")
//    private String username;
//
//    @Value("${mqtt.password}")
//    private String password;
//
//    @Value("${mqtt.timeout}")
//    private int timeout;
//
//    @Value("${mqtt.keepalive}")
//    private int keepalive;
//
//
//    private MqttClient mqttClient;
//
//
//    @Bean
//    public MqttClient mqttClient() throws MqttException {
//        // host为主机名，clientId即连接MQTT的客户端ID，一般以唯一标识符表示，MemoryPersistence设置clientid的保存形式，默认为以内存保存
//        mqttClient = new MqttClient(url, MQTT_CLIENTID, new MemoryPersistence());
//        // MQTT的连接设置
//        MqttConnectOptions option = new MqttConnectOptions();
//        // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录，设置为true表示每次连接到服务器都以新的身份连接
//        option.setCleanSession(true);
//        // 设置连接的用户名
//        option.setUserName(username);
//        // 设置连接的密码
//        option.setPassword(password.toCharArray());
//        // 设置超时时间 单位为秒
//        option.setConnectionTimeout(timeout);
//        // 设置会话心跳时间 单位为秒 服务器会每隔1.5*10秒的时间向客户端发送个消息判断客户端是否在线，但这个方法并没有重连的机制
//        option.setKeepAliveInterval(keepalive);
//        // 开启断开自动重连
//        option.setAutomaticReconnect(true);
//        // setWill方法，如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息遗嘱
////        option.setWill(mqttClient.getTopic(MQTT_TOPIC[0]), "close".getBytes(), 2, true);
//        // 设置回调
//        mqttClient.setCallback(new PushCallback());
//        // 建立连接
//        mqttClient.connect(option);
//        // 订阅默认主题
//        mqttClient.subscribe(MQTT_TOPIC);
//
//        log.info("mqtt连接成功，clientId:" + MQTT_CLIENTID);
//
//        return mqttClient;
//    }
//
//    /**
//     * 消息推送，广播
//     * @param topic 主题
//     * @param data  消息内容
//     */
//    public void publish(String topic, String data) {
//
//        publish(topic,data,2,false);
//    }
//
//    /**
//     * 消息推送，广播
//     * @param topic 主题
//     * @param data  消息内容
//     * @param qos 消息质量 0：至少送达一次 1：至多送达1次 2：只送达一次
//     * @param retained  是否保留最后一条消息，true：保留该topic的最后一条消息 false:不保留
//     */
//    public void publish(String topic, String data, int qos, boolean retained) {
//        MqttMessage message = new MqttMessage();
//        message.setQos(qos);
//        message.setRetained(retained);
//        message.setPayload(data.getBytes());
//        MqttTopic mqttTopic = mqttClient.getTopic(topic);
//        if (null == mqttTopic) {
//            log.info("Topic不存在");
//        }
//        MqttDeliveryToken token;
//        try {
//            token = mqttTopic.publish(message);
//            token.waitForCompletion();
//
////            log.info("mqtt推送消息：topic："+topic+"，内容："+data);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 消息推送，发送给指定token的用户
//     * @param topic 主题
//     * @param data  消息内容
//     */
//    public void publish(String topic, String data,String userToken) {
//
//        publish(topic,data,2,true,userToken);
//    }
//
//    /**
//     * 消息推送，发送给指定token的用户
//     * @param topic 主题
//     * @param data  消息内容
//     * @param qos   消息质量 0：至少送达一次 1：至多送达1次 2：只送达一次
//     * @param retained 是否保留最后一条消息，true：保留该topic的最后一条消息
//     */
//    public void publish(String topic, String data, int qos, boolean retained,String userToken) {
//
//        publish(userToken+"/private/"+topic,data,qos,retained);
//    }
//
//    /**
//     * 增加订阅某个主题
//     * @param topic 主题
//     * @param qos   消息质量 0：至少送达一次 1：至多送达1次 2：只送达一次
//     */
//    public void subscribe(String topic, int qos) throws MqttException {
//        mqttClient.subscribe(topic,qos);
//    }
//
//    /**
//     * 取消订阅某个主题
//     * @param topic
//     */
//    public void unsubscribe(String topic) throws MqttException {
//        mqttClient.unsubscribe(topic);
//    }
//}
